package com.yboot.framework.plugin.generator.utils;

import com.yboot.framework.plugin.generator.entity.GenTable;
import com.yboot.framework.plugin.generator.property.CodeGenProperty;
import com.yboot.framework.plugin.generator.property.EnumFunctionOption;
import org.apache.commons.lang.CharEncoding;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.util.List;
import java.util.Properties;

/**
 * @author .
 * @date 2022-11-10
 */
public class VelocityUtil {

    /**
     * 初始化vm方法
     */
    public static void initVelocity() {
        Properties p = new Properties();
        try {
            // 加载classpath目录下的vm文件
            p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            // 定义字符集
            p.setProperty(Velocity.ENCODING_DEFAULT, CharEncoding.UTF_8);
            p.setProperty(Velocity.OUTPUT_ENCODING, CharEncoding.UTF_8);
            // 初始化Velocity引擎，指定配置Properties
            Velocity.init(p);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 初始化模版变量
     *
     * @param property 公共参数
     * @param table    表信息
     * @return 模版上下文
     */
    public static VelocityContext prepareContext(CodeGenProperty property, GenTable table) {

        VelocityContext context = new VelocityContext();

        // 公共部分 参数
        context.put("basePackage", property.getOutput().getBasePackage());
        context.put("author", property.getAuthor());
        context.put("createTime", property.getCreateTime());
        context.put("className", table.getClassName());

        // 表信息
        context.put("tableName", table.getTableName());
        context.put("pkColumn", table.getPkColumn());
        context.put("columns", table.getColumns());

        // 可选信息
        List<EnumFunctionOption> options = property.getGenOption().getExcludeFunctionOptions();
        context.put("skipPage", options.contains(EnumFunctionOption.Page));
        context.put("skipDetail", options.contains(EnumFunctionOption.Detail));
        context.put("skipSave", options.contains(EnumFunctionOption.Save));
        context.put("skipUpdate", options.contains(EnumFunctionOption.Update));
        context.put("skipDelete", options.contains(EnumFunctionOption.Delete));
        context.put("tableComment", table.getTableComment());

        // Controller 参数
        context.put("requestMapping", property.getController().getRequestMapping());
        context.put("businessName", property.getController().getBusinessName());

        return context;
    }

}
